[normalize]标准化数据¶
图像处理过程中常用的操作之一就是数据标准化,OpenCV提供了函数cv::normalize来完成
函数解析¶
CV_EXPORTS_W void normalize( InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0,
int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());
src:输入数组dst:输出数组,大小和原图一致alpha:标准化值或者按范围标准化的下范围边界beta:按范围标准化时的上范围边界;它不作用于范数标准化norm_type:标准化类型,参考cv::NormTypesdtype:如果为负(默认),则输出数组的类型与src相同;否则,其通道数与src相同,数据深度=CV_MAT_DEPTH(dtype)mask:操作掩码(可选)
标准化方式¶
函数normalize根据参数norm_type决定数据标准化方式
当normType=NORM_INF/NORM_L1/NORM_L2时,其计算方式如下:

当normType=NORM_MINMAX时,其计算方式如下:

示例¶
假定测试数据如下:
vector<double> positiveData = { 2.0, 8.0, 10.0 };
当normType=NORM_L1时,通过L1范数计算总数,然后缩放到alpha大小,比如
normalize(positiveData, normalizedData_l1, 1.0, 0.0, NORM_L1);
则计算结果为
sum(numbers) = 20.0
2.0 0.1 (2.0/20.0)
8.0 0.4 (8.0/20.0)
10.0 0.5 (10.0/20.0)
当normType=NORM_L2时,通过L2范数计算总数,然后缩放到alpha大小,比如
normalize(positiveData, normalizedData_l2, 1.0, 0.0, NORM_L2);
计算结果如下
sum(numbers) = sqrt(2*2 + 8*8 + 10*10) = sqrt(168) = 12.96
Norm to unit vector: ||positiveData|| = 1.0
2.0 0.15 (2 / 12.96)
8.0 0.62 (8 / 12.96)
10.0 0.77 (10/ 12.96)
当normType=NORM_MINMAX时,将数据缩放到[alpha, beta]大小,比如
normalize(positiveData, normalizedData_minmax, 1.0, 0.0, NORM_MINMAX);
将数据缩放到[0.0, 1.0]大小,计算结果如下:
2.0 0.0 (shift to left border)
8.0 0.75 (6.0/8.0)
10.0 1.0 (shift to right border)